home *** CD-ROM | disk | FTP | other *** search
/ Resource for Source: C/C++ / Resource for Source - C-C++.iso / misc_src / ebksrc / pckey.hpp < prev    next >
C/C++ Source or Header  |  1995-11-01  |  8KB  |  324 lines

  1. /*
  2.  
  3.     pckey.hpp
  4.     7-30-91
  5.     PC keyboard class for Borland C++
  6.  
  7.     Copyright 1991
  8.     John W. Small
  9.     All rights reserved
  10.     Use freely but acknowledge authorship and copyright.
  11.  
  12.     PSW / Power SoftWare
  13.     P.O. Box 10072
  14.     McLean, Virginia 22102 8072 USA
  15.  
  16.     John Small
  17.     Voice: (703) 759-3838
  18.     CIS: 73757,2233
  19.  
  20. */
  21.  
  22. #ifndef PCKEY_HPP
  23. #define PCKEY_HPP
  24.  
  25. #include <dos.h>
  26.  
  27.  
  28. //  Typematic Rate = 10 x characters per second
  29. //  characters per second = TypeMaticRate / 10
  30.  
  31. enum TypeMaticRate  { TMR300, TMR267, TMR240, TMR218,
  32.     TMR200, TMR185, TMR171, TMR160, TMR150, TMR133,
  33.     TMR120, TMR109, TMR100, TMR092, TMR086, TMR080,
  34.     TMR075, TMR067, TMR060, TMR055, TMR050, TMR046,
  35.     TMR043, TMR040, TMR037, TMR033, TMR030, TMR027,
  36.     TMR025, TMR023, TMR021, TMR020 };
  37.  
  38.  
  39. //  Typematic Delay in milliseconds
  40.  
  41. enum TypeMaticDelay  { TMD250, TMD500, TMD750, TMD1000 };
  42.  
  43. //  Returned by extended keys on 101/102 keyboards
  44. //  that duplicate keys available on 84 key format.
  45. //  Consider the home key ...
  46. //  On number pad:  PCK.ascii() ==   0  PCK.scan() == 71
  47. //  By itself:      PCK.ascii() == 224  PCK.scan() == 71
  48. #define  ExtendKey   224
  49.  
  50.  
  51. //  Do not instantiate!
  52.  
  53. class PCKey  {
  54. // Variables are static to save having to dereference
  55. // the "this" pointer in the inline member functions.
  56. static    unsigned asciiScan;
  57. static    unsigned char enhancedKeyBrd;
  58. static    unsigned enhancedShiftMask;
  59. static  unsigned fastTypeMaticExit;
  60. public:
  61.     PCKey();
  62.     int enhanced()  { return (int) enhancedKeyBrd; }
  63. // Ascii code of last character read with getch(), getkey(),
  64. // or character waiting with kbhit().
  65.     int ascii()
  66.         { return (int)(asciiScan & 0x00FF); }
  67. // Scan code of last character read with gethch(), getkey(),
  68. // or character waiting with kbhit().
  69.     int scan()
  70.         { return (int)((asciiScan & 0xFF00) >> 8); }
  71. // special characters return zero or ExtendKey, see scan()
  72.     int getch()  {
  73.         _AH = enhancedKeyBrd;
  74.         geninterrupt(0x16);
  75.         asciiScan = _AX;
  76.         return (int) _AL;
  77.     }
  78. // special characters return the negative of their scan code
  79. // non special characters return their ascii code
  80.     int getkey()  {
  81.         _AH = enhancedKeyBrd;
  82.         geninterrupt(0x16);
  83.         asciiScan = _AX;        
  84.         return ((_AL && _AL != ExtendKey)?
  85.             (int)_AL : -(int)_AH);
  86.     }    
  87.     int kbhit()  {
  88.         _AH = 0x01 | enhancedKeyBrd;
  89.         geninterrupt(0x16);
  90.         asciiScan = _AX;
  91.         return !(int)(_FLAGS & 0x0040);
  92.     }
  93.     unsigned shift()  {
  94.         _AH = 0x02 | enhancedKeyBrd;
  95.         geninterrupt(0x16);
  96.         return (_AX & enhancedShiftMask);
  97.     }
  98.     unsigned InsertStateActive()
  99.         { return (shift() & 0x0080); }
  100.     unsigned CapsLockActive()
  101.         { return (shift() & 0x0040); }
  102.     unsigned NumLockActive()
  103.         { return (shift() & 0x0020); }
  104.     unsigned ScrollLockActive()
  105.         { return (shift() & 0x0010); }
  106.     unsigned AltPressed()
  107.         { return (shift() & 0x0008); }
  108.     unsigned CtrlPressed()
  109.         { return (shift() & 0x0004); }
  110.     unsigned LeftShiftPressed()
  111.         { return (shift() & 0x0002); }
  112.     unsigned RightShiftPressed()
  113.         { return (shift() & 0x0001); }
  114.     unsigned ShiftPressed()
  115.         { return (shift() & 0x0003); }
  116.     unsigned SysReqPressed()
  117.         { return (shift() & 0x8000); }
  118.     unsigned CapsLockPressed()
  119.         { return (shift() & 0x4000); }
  120.     unsigned NumLockPressed()
  121.         { return (shift() & 0x2000); }
  122.     unsigned ScrollLockPressed()
  123.         { return (shift() & 0x1000); }
  124.     unsigned RightAltPressed()
  125.         { return (shift() & 0x0800); }
  126.     unsigned RightCtrlPressed()
  127.         { return (shift() & 0x0400); }
  128.     unsigned LeftAltPressed()
  129.         { return (shift() & 0x0200); }
  130.     unsigned LeftCtrlPressed()
  131.         { return (shift() & 0x0100); }
  132.     void setTypeMatic(
  133.         enum TypeMaticRate TMrate = TMR109,
  134.         enum TypeMaticDelay TMdelay = TMD500)  {
  135.         _BX = (TMdelay << 8) | TMrate;
  136.         _AX = 0x0305;
  137.         geninterrupt(0x16);
  138.     }
  139.     void fastTypeMatic()  { setTypeMatic(TMR300,TMD250); }
  140.     void fastTypeMaticOnExit()  { fastTypeMaticExit = 1; }
  141.     int putch(unsigned asciiScan)  {
  142.         _CX = asciiScan;
  143.         _AH = 0x05;
  144.         geninterrupt(0x16);
  145.         return !((int) _AL);
  146.     }
  147.     void flush();
  148.     ~PCKey() { if (fastTypeMaticExit) fastTypeMatic();
  149.         else setTypeMatic(); }
  150. };
  151.  
  152. extern PCKey PCK;  // Only instant, do not instantiate!
  153.  
  154.  
  155. //  Note: Ctrl keys are not special!
  156. //  Returned by getch() and ascii().
  157.  
  158. #define  CtrlA     1
  159. #define  CtrlB     2
  160. #define  CtrlC     3
  161. #define  CtrlD     4
  162. #define  CtrlE     5
  163. #define  CtrlF     6
  164. #define  CtrlG     7
  165. #define  CtrlH     8
  166. #define  CtrlI     9
  167. #define  CtrlJ    10
  168. #define  CtrlK    11
  169. #define  CtrlL    12
  170. #define  CtrlM    13
  171. #define  CtrlN    14
  172. #define  CtrlO    15
  173. #define  CtrlP    16
  174. #define  CtrlQ    17
  175. #define  CtrlR    18
  176. #define  CtrlS    19
  177. #define  CtrlT    20
  178. #define  CtrlU    21
  179. #define  CtrlV    22
  180. #define  CtrlW    23
  181. #define  CtrlX    24
  182. #define  CtrlY    25
  183. #define  CtrlZ    26
  184.  
  185.  
  186. //  Special Key Codes returned via scan() when getch() == 0.
  187.  
  188. #define  AltA         30
  189. #define  AltB         48
  190. #define  AltC         46
  191. #define  AltD         32
  192. #define  AltE         18
  193. #define  AltF         33
  194. #define  AltG         34
  195. #define  AltH         35
  196. #define  AltI         23
  197. #define  AltJ         36
  198. #define  AltK         37
  199. #define  AltL         38
  200. #define  AltM         50
  201. #define  AltN         49
  202. #define  AltO         24
  203. #define  AltP         25
  204. #define  AltQ         16
  205. #define  AltR         19
  206. #define  AltS         31
  207. #define  AltT         20
  208. #define  AltU         22
  209. #define  AltV         47
  210. #define  AltW         17
  211. #define  AltX         45
  212. #define  AltY         21
  213. #define  AltZ         44
  214.  
  215. #define  Home         71
  216. #define  UpArr        72
  217. #define  PgUp         73
  218. #define  LArr         75
  219. #define  RArr         77
  220. #define  EndKey       79
  221. #define  DnArr        80
  222. #define  PgDn         81
  223. #define  InsKey       82
  224. #define  DelKey       83
  225.  
  226. #define  CtrlHome    119
  227. #define  CtrlPgUp    132
  228. #define  CtrlLArr    115
  229. #define  CtrlRArr    116
  230. #define  CtrlEnd     117
  231. #define  CtrlPgDn    118
  232.  
  233. #define  Alt1        120
  234. #define  Alt2        121
  235. #define  Alt3        122
  236. #define  Alt4        123
  237. #define  Alt5        124
  238. #define  Alt6        125
  239. #define  Alt7        126
  240. #define  Alt8        127
  241. #define  Alt9        128
  242. #define  Alt0        129
  243.  
  244. #define  AltHyphen   130
  245. #define  AltEquals   131
  246. #define  CtrlPrtSc   114
  247. #define  ShiftTab     15
  248.  
  249.  
  250. #define  F1           59
  251. #define  ShiftF1      84
  252. #define  CtrlF1       94
  253. #define  AltF1       104
  254.  
  255. #define  F2           60
  256. #define  ShiftF2      85
  257. #define  CtrlF2       95
  258. #define  AltF2       105
  259.  
  260. #define  F3           61
  261. #define  ShiftF3      86
  262. #define  CtrlF3       96
  263. #define  AltF3       106
  264.  
  265. #define  F4           62
  266. #define  ShiftF4      87
  267. #define  CtrlF4       97
  268. #define  AltF4       107
  269.  
  270. #define  F5           63
  271. #define  ShiftF5      88
  272. #define  CtrlF5       98
  273. #define  AltF5       108
  274.  
  275. #define  F6           64
  276. #define  ShiftF6      89
  277. #define  CtrlF6       99
  278. #define  AltF6       109
  279.  
  280. #define  F7           65
  281. #define  ShiftF7      90
  282. #define  CtrlF7      100
  283. #define  AltF7       110
  284.  
  285. #define  F8           66
  286. #define  ShiftF8      91
  287. #define  CtrlF8      101
  288. #define  AltF8       111
  289.  
  290. #define  F9           67
  291. #define  ShiftF9      92
  292. #define  CtrlF9      102
  293. #define  AltF9       112
  294.  
  295. #define  F10          68
  296. #define  ShiftF10     93
  297. #define  CtrlF10     103
  298. #define  AltF10      113
  299.  
  300. //  Some BIOS' don't return these.
  301.  
  302. #define  F11         133
  303. #define  ShiftF11    135
  304. #define  CtrlF11     137
  305. #define  AltF11      139
  306.  
  307. #define  F12         134
  308. #define  ShiftF12    136
  309. #define  CtrlF12     138
  310. #define  AltF12      140
  311.  
  312.  
  313. //  Non special - standard character codes.
  314.  
  315. #define  ESC          27
  316. #define  CR           13
  317. #define  TAB           9
  318. #define  BACKSP        8
  319. #define  SPACE        32
  320. #define  DelCh       127
  321.  
  322.  
  323. #endif
  324.